﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace TiEntityObject.Transport
{
    /// <summary>
    /// Настройки инструментария по работе с прикрпленной документацией
    /// </summary>
    public class AttachConvertorConfig {
    
    /// <summary>
    /// Хранилище прикрепленной документации
    /// </summary>
        public string AttachFolder { get; set; }
        public string HtmlFolder { get; set; }
        public string Soffice_WorkFolder { get; set; }
        public string Soffice_MacroTemplate { get; set; }
    }

    public class TransportConfig
    {
        private static TransportConfig instance = null;
        public static TransportConfig Instance
        {
            get
            {
                if (null == instance)
                    instance = TransportConfig.ReadConfig();
                return instance;
            }
        }

        const string defFileName = "TransportConfig.xml";

        private static string GetFolderConfig() { 
             return Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments)+@"\TI_DATA\";            
        }

        public static string GetConfigFileName() {        
            return GetFolderConfig() + defFileName;
        }

        public List<long> MnnKeys { get; set; }        

        public static TransportConfig config = null;
        public static TransportConfig ReadConfig()
        {
            if (null != config)
                        return config;

            TransportConfig result = null;
            string filename = GetConfigFileName();
            if (!File.Exists(filename))
            {             
                result = DefautCreateConfig();
                result.WriteConfig();
                config = result;
                return config;
            }
            
            XmlSerializer serializer = new XmlSerializer(typeof(TransportConfig));
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
                config = (TransportConfig)serializer.Deserialize(fs);
                fs.Close();
            }

            return config;
        }

        public void WriteConfig()
        {
            string filename = GetConfigFileName();
            XmlSerializer mySerializer = new
            XmlSerializer(typeof(TransportConfig));
            using (StreamWriter myWriter = new StreamWriter(filename))
            {
                mySerializer.Serialize(myWriter, this);
                myWriter.Close();
            }
        }

        public static TransportConfig DefautCreateConfig()
        {

            TransportConfig c = new TransportConfig();

            c.AttchConvertorConfig = new AttachConvertorConfig();

            c.URL = @"ftp://free:free@77.246.101.195:21";

            c.FtpRoot = @"C:\TI_DATA\FTP\";

            c.ReportFolder = @"C:\TI_DATA\Reports\";

            c.ErrZipFolder = @"C:\TI_DATA\ErrZipFolder\";

            c.FtpFileMask = @"*.xml";

            c.ErrXmlFolder = @"C:\TI_DATA\TransportErr\";

            c.AttchConvertorConfig.AttachFolder = @"C:\TI_DATA\AttachFolder\";

            c.AttchConvertorConfig.HtmlFolder = @"C:\TI_DATA\HtmlFolder\";

            c.AttchConvertorConfig.Soffice_WorkFolder = @"C:\Program Files (x86)\OpenOffice.org 3\program\";

            c.AttchConvertorConfig.Soffice_MacroTemplate = @"""macro:///Standard.Module1.{0}({1},{2})""";
            
            c.XapianBase = @"C:\\TI_DATA\\Xapian\\DB\\";

            c.XapianFileBase = @"C:\\TI_DATA\\Xapian\\Content";

            c.TagTempFolder = @"C:\\TI_DATA\\TEMP_TAGS\\";

            c.OfiiceHTMLFolder = @"C:\\TI_DATA\\OfiiceHTMLFolder\\";

            c.TempDecompressFolder = @"C:\\TI_DATA\\TempDecompressFolder\\";

            c.TheardCount = 5;

            c.AttachDocPackSize = 100;

            c.KeyWords = new List<string>();
            c.KeyWords.Add("TEST");

            Helper.FileTools.СeckAndCreateFolder(c.ErrXmlFolder);

            Helper.FileTools.СeckAndCreateFolder(c.ErrZipFolder);

            Helper.FileTools.СeckAndCreateFolder(c.ReportFolder);

            Helper.FileTools.СeckAndCreateFolder(c.AttchConvertorConfig.AttachFolder );

            Helper.FileTools.СeckAndCreateFolder(c.XapianBase);

            Helper.FileTools.СeckAndCreateFolder(c.XapianFileBase);

            Helper.FileTools.СeckAndCreateFolder(c.TagTempFolder);
            
            c.WriteConfig();
            return c;
        }
        
        /// <summary>
        /// Кореннь FTP структуры
        /// </summary>
        public string FtpRoot { get; set; }

        public List<string> KeyWords { get; set; }

        /// <summary>
        /// Папка журнала операций
        /// </summary>
        public string ReportFolder {get;set;}

        /// <summary>
        /// Папка преобразованных документов в HTML
        /// </summary>
        public string OfiiceHTMLFolder { get; set; }


        /// <summary>
        /// Ограничение по маске обрабатываемых файлов
        /// </summary>
        public string FtpFileMask{get;set;}

        /// <summary>
        /// Копии xml файлов не прошедших обработку
        /// </summary>
        public string ErrXmlFolder { get; set; }

        /// <summary>
        /// Копии zip файлов не прошедших обработку
        /// </summary>
        public string ErrZipFolder { get; set; }

        /// <summary>
        /// Количество потоков обработки
        /// </summary>
        public int TheardCount{get;set;}

        /// <summary>
        /// Госзакупки
        /// </summary>
        public string URL { get; set; }

        public AttachConvertorConfig AttchConvertorConfig {get;set;}
    
        /// <summary>
        /// Каталог базы полнотектового поиска
        /// </summary>
        public string XapianBase { get; set; }

        /// <summary>
        /// Хранилище ресурсов базы полнотектового поиска - распарсенные документы
        /// </summary>
        public string XapianFileBase { get; set; }

        /// <summary>
        /// Рабочая папка для формирования облака тэгов
        /// </summary>
        public string TagTempFolder { get; set; }

        /// <summary>
        /// Размер запрашиваемой порции документов для скачивани
        /// </summary>
        public int AttachDocPackSize { get; set; }

       /// <summary>
       /// Количество файлов поступающих на обработку
       /// </summary>
        public int IndexDocPackSize { get; set; }

        /// <summary>
        /// Временная директория - распаковка  прикрепленной документации
        /// </summary>
        public string TempDecompressFolder { get; set; }
       
        /// <summary>
        /// Формирование папки для дневного цикла. Скачка с FTP. 
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public  string GetFtpDayFolder(DateTime day) {
            return FtpRoot + day.ToShortDateString()+@"\";
        }

        #region Правила формирования путей при работе с FTP ресурсом
        /// <summary>
        /// Вернуть путь файла в ftp директории
        /// </summary>
        /// <param name="day"></param>
        /// <param name="FolderName"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public string GetFtpFileName(DateTime day, string regionName, string fileName)
        {
            string p = FtpRoot + day.ToShortDateString() + @"\" + regionName + @"\";
            Helper.FileTools.СeckAndCreateFolder(p);
            return p + fileName;
        }

        public string GetFolderUrl(string folderName)
        {
            return URL + @"/" + folderName + @"/";
        }

        public string GetFileURL(string folderName, string fileName)
        {
            return URL + @"/" + folderName + @"/" + fileName;

        }
       

        /// <summary>
        /// Вернуть набор файлов прикрепленных  по маске кодфайла*.* 
        /// </summary>
        /// <returns></returns>
        public string[] GetAttachFileList(string[] patterns)
        {
            List<string> l = new List<string>();         
            for(int i=0;i<patterns .Length ;i++)
            {                
               l.AddRange ( Directory.GetFiles(AttchConvertorConfig.AttachFolder, patterns[i] + "*.*"));
            }
            return l.ToArray();
        }

        public string GetStoreFilePath(DateTime day, string FolderName, string fileName)
        {
            string p = GetStoreFolderPath(day, FolderName); 
            Helper.FileTools.СeckAndCreateFolder(p);
            return p + fileName;
        }

        public string GetStoreFolderPath(DateTime day, string FolderName)
        {
            string p = FtpRoot + day.ToShortDateString() + @"\" + FolderName + @"\";
            Helper.FileTools.СeckAndCreateFolder(p);
            return p;
        }

        /// <summary>
        /// Вернуть путь к папке с прикреплееной документацией
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public string GetAttachStoreFolderPath(DateTime day)
        {
            string p = AttchConvertorConfig.AttachFolder  + day.ToShortDateString() ;
            Helper.FileTools.СeckAndCreateFolder(p);
            return p;
        }


        /// <summary>
        /// Вернуть путь к папке с прикреплееной документацией
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public string GetHtmlStoreFolderPath(DateTime day)
        {
            string p = AttchConvertorConfig.HtmlFolder + day.ToShortDateString() + @"\";
            Helper.FileTools.СeckAndCreateFolder(p);
            return p;
        }
        #endregion
    }
}




